#include <SFML/Graphics.hpp>
#include <time.h>
#include <iostream>
using namespace std;
using namespace sf;
int wide = 400;
int high = 600;
struct point
{
	int x, y;
};

int main()
{
	srand(time(0));
	RenderWindow app(VideoMode(wide, high), "Doodle Jump--YzHCat");
	int start = 1;			   // 启动控制
	app.setFramerateLimit(60); // 将帧速率限制为最大固定频率
	Texture t1, t2, t3;
	t1.loadFromFile("../images/background.png");
	t2.loadFromFile("../images/platform.png");
	t3.loadFromFile("../images/doodle.png");

	Sprite sBack(t1), sPlat(t2), sPers(t3);
	sPers.setOrigin(40, 0); // 设置对象的局部原点 默认(0,0)

	// 加载字体
	Font font;
	if (!font.loadFromFile("../FiraCode-Light.ttf"))
		return -1;
	int m = 0, n = 0; // 得分
	sf::String score = "score:";
	Text text(score + "0", font);
	// 设置字体大小
	text.setCharacterSize(30);
	// 设置填充颜色
	text.setFillColor(Color::Black);

	int p_use = 15;	  // 平台 数量
	int toReduce = 0; // 减少数量
	point plat[p_use];

	for (int i = 0; i < p_use; i++) // 随机位置
	{
		plat[i].x = rand() % (wide - 68);		 // 减去平台宽度，
		plat[i].y = rand() % (high - 100) + 100; // 降低初始平台高度，避免第一次踩不到
	}
	int reset = 0; // 平台重置
	int x = 200, y = 400, /*初始位置*/ h = high * 0.4;
	float dy = 0;

	while (app.isOpen())
	{
		Event e;
		while (app.pollEvent(e))
		{
			if (e.type == Event::Closed)
				app.close();
			if (e.type == Event::KeyPressed)
			{
				if (e.key.code == Keyboard::Escape)
					app.close();
				if (e.key.code == Keyboard::Space)
					start = 1 - start; // 暂停
				if (e.key.code == Keyboard::R)
					reset = 1; // 平台重置
			}
		}
		if (start)
		{
			if (Keyboard::isKeyPressed(Keyboard::Left))
			{
				x -= 3;
				sPers.setScale(1, 1);
			}
			if (Keyboard::isKeyPressed(Keyboard::Right))
			{
				x += 3;
				sPers.setScale(-1, 1);
			}

			if (x >= wide + 40)
				x = 0;
			else if (x <= -40)
				x = wide;

			dy += 0.2;
			y += dy;		   // 下落
			if (y > high - 70) // doodle图片 80×80 px
				dy = -10;	   // 弹跳
			if (y < h)		   // 高度达到h时
				for (int i = 0; i < p_use; i++)
				{
					y = h;						// doodle 坐标更新到h
					plat[i].y = plat[i].y - dy; // 平台下移
					m -= dy;
					if (m >= 1000)
					{
						n += m / 1000;
						m = 0;
						if (n % 30 == 29) // 难度
						{
							// 分数达标 确认减少平台
							if (p_use > 6) // 平台最少为6
								toReduce = 1;
						}
					}
					if (plat[i].y > high) // 平台超出底部时
					{
						if (toReduce) // 开始减少平台数量
						{
							for (; i < p_use; i++)
								plat[i] = plat[i + 1];
							p_use--;
							toReduce = 0;
						}
						else
						{
							plat[i].y = 0;					  // 坐标到顶部
							plat[i].x = rand() % (wide - 68); // 随机x
						}
					}
				}

			if (reset && n >= 10) // 重置
			{
				for (int i = 0; i < p_use; i++) // 随机位置
				{
					plat[i].y = rand() % high;
				}
				n -= 10;
				reset = 0;
			}

			/* doodle 脚的位置 x+[-40~40]  y+70 */
			/* 平台大小68*14 */
			for (int i = 0; i < p_use; i++)
				if ((x + 40 > plat[i].x) && (x - 40 < plat[i].x + 68) && (y + 70 > plat[i].y) && (y + 70 < plat[i].y + 14) && (dy > 0))
					dy = -10; // 弹跳
			sPers.setPosition(x, y);
			app.draw(sBack);
			app.draw(sPers);
			for (int i = 0; i < p_use; i++)
			{
				sPlat.setPosition(plat[i].x, plat[i].y);
				app.draw(sPlat);
			}

			text.setString(score + to_string(n) + "." + to_string(m));
			app.draw(text);
			app.display();
		}
	}

	return 0;
}
